#ifndef FILE_H_
#define FILE_H_

#include "fileStructs.h"
#include <stdbool.h>

/* R_Create
 * Crea un archivo preparado para organizacion relativa.
 * nombre_fisico: nombre y ubicacion del archivo.
 * tam_registro: tamanyo de los registros que contendra el archivo.
 * max_reg: cantidad de registros que tendra el archivo.
 *
 * Retorno:
 * RES_ERROR - No puede crear el archivo o se ingresa un tamanyo o cantidad de registros negativa.
 * RES_EXISTE - Archivo ya existe en el almacenamiento.
 * RES_OK - Archivo creado con exito.
 */
int R_CREATE (const char* nombre_fisico, int tam_registro, unsigned long max_reg);

int R_BUSQBINARIA(fHandler *handler, const char *nombre);

/* R_OPEN
 * Abre al archivo.
 * nombre_fisico: nombre y ubicacion del archivo.
 * modo: READ, WRITE o READ_WRITE
 *
 * Retorno:
 * Handler del archivo - Se abrio con exito.
 * NULL - Error al abrir (no existe el archivo, error del sistema, etc).
 */
fHandler *R_OPEN (const char* nombre_fisico, int modo);

/* R_CLOSE
 * Cierra el archivo previamente abierto.
 * handler: handler del archivo
 *
 * Retorno:
 * RES_ERROR - Fallo al cerrar.
 * RES_OK - Cerrado con exito.
 */
int R_CLOSE (fHandler *handler);

/* R_SEEK
 * Posiciona el record pointer en el registro especificado para luego hacer lectura secuencial con R_READNEXT.
 * handler: handler del archivo.
 * nrec: numero del registro donde se posicionara el record pointer.
 *
 * Retorno:
 * RES_ERROR - Se ingreso un numero de registro fuera de rango.
 * RES_NO_EXISTE - No existe el registro elegido con nrec, sin embargo, coloca el pointer en esa posicion.
 * RES_OK - Existe el registro y se completo la operacion con exito.
 */
int R_SEEK (fHandler *handler, unsigned long nrec);

/* R_READ
 * Lectura por referencia a un determinado registro.
 * handler: handler del archivo.
 * nrec: numero de registro.
 * reg: buffer donde se almacenara el registro leido.
 *
 * Retorno:
 * RES_ERROR - Se ingreso un numero de registro fuera de rango.
 * RES_NO_EXISTE - Registro vacio.
 * RES_OK - Operacion terminada con exito.
 */
int R_READ (fHandler *handler, int nrec, void* reg);

/**
 *
 */
bool R_EXISTE_REG (fHandler *handler, unsigned long nrec);

/* R_READNEXT
 * Lectura secuencial sobre el archivo. Solo retorna los registros ocupados (no pasa por los libres) cada
 * R_READNEXT actualiza el record pointer hasta el siguiente registro lleno.
 * handler: handler del archivo.
 * reg: buffer donde se almacenara el registro.
 *
 * Retorno:
 * RES_EOF - Cuando se acaban los registros ocupados.
 * RES_ERROR - Se produjo un error de lectura.
 * Registro leido - retorna el ultimo registro leido.
 */
int R_READNEXT (fHandler *handler, void* reg);

/* R_WRITE
 * Escribe sobre un registro desocupado del archivo.
 * handler: handler del archivo.
 * nrec: numero de registro.
 * reg: buffer que se copiara al archivo.
 *
 * Retorno:
 * RES_ERROR - Archivo en modo READ, nrec fuera de rango, error de escritura.
 * RES_EXISTE - El registro donde se quiere escribir esta ocupado.
 * RES_OK - Operacion exitosa.
 *
 */
int R_WRITE (fHandler *handler, unsigned long nrec, const void* reg);

/* R_UPDATE
 * Actualiza un registro existente.
 * handler: handler del archivo.
 * nrec: numero de registro.
 * reg: buffer donde se almacena el registro actualizado.
 *
 * Retorno:
 * RES_ERROR - Archivo en modo READ, nrec fuera de rango, error de escritura.
 * RES_NO_EXISTE - No existe el registro apuntado por nrec.
 * RES_OK - Operacion completada con exito.
 */
int R_UPDATE (fHandler *handler, unsigned long nrec, const void* reg);

/* R_DELETE
 * Elimina un registro del archivo.
 * handler: handler del archivo.
 * nrec: numero de registro.
 *
 * Retorno:
 * RES_ERROR - Archivo en modo READ, nrec fuera de rango.
 * RES_NO_EXISTE - Registro vacio.
 * RES_OK - Operacion completada con exito.
 */
int R_DELETE (fHandler *handler, unsigned long nrec);

/* R_DESTROY
 * Elimina el archivo del medio de almacenamiento.
 * nombre_fisico: nombre y ubicacion del archivo.
 *
 * Retorno:
 * RES_ERROR - Error en la operacion.
 * RES_OK - Operacion exitosa.
 */
int R_DESTROY(const char* nombre_fisico);

/* R_GETMAXREGS
 * Retorna la cantidad de registros ocupados del archivo.
 * handler: handler del archivo.
 *
 * Retorno:
 * Cantidad de registros ocupados.
 */
int R_GETMAXREGS(fHandler *handler);

#endif
